package com.example.demo.common;

import cn.hutool.core.util.StrUtil;
import com.auth0.jwt.JWT;
import com.auth0.jwt.JWTVerifier;
import com.auth0.jwt.algorithms.Algorithm;
import com.auth0.jwt.exceptions.JWTVerificationException;
import com.example.demo.entity.Admin;
import com.example.demo.exception.CustomException;
import com.example.demo.service.AdminService;
import com.mysql.cj.util.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.HandlerInterceptor;

import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

// 注意：需要添加@Component注解以便Spring扫描到该Bean
@Component
public class JwtInterceptor implements HandlerInterceptor {//

    private static final Logger log = LoggerFactory.getLogger(JwtInterceptor.class); // 注意getLogger大小写

    // 使用@Autowired注解而不是@Resource
    @Resource
    private AdminService adminService; // 注意类名的大小写应保持一致

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) {
        // 1. 获取token
        String token = request.getHeader("token");
        if (StrUtil.isBlank(token)) {
            token = request.getParameter("token");
        }
        // 2. 开始执行认证
        if (StrUtil.isBlank(token)) {
            throw new CustomException("无token，请重新登录"); // 注意字符串的引号
        }
        // 获取token中的adminId
        String adminId;
        Admin admin;
        try {
            // 假设Jwt.decode方法返回的是一个包含用户信息的对象
            adminId = JWT.decode(token).getAudience().get(0); // 这里假设Jwt.decode方法返回的对象有getAudience方法
            // 根据token中的adminId查询数据库
            admin = adminService.findById(Integer.parseInt(adminId)); // 注意方法名可能是findById而不是findByById
        } catch (Exception e) {
            String errMsg = "token验证失败，请重新登录";
            log.error(errMsg + ", token=" + token, e);
            throw new CustomException(errMsg); // 注意异常类名的大小写
        }
        if (admin == null) {
            throw new CustomException("用户不存在，请重新登录"); // 注意异常类名的大小写
        }
        try {
            // 用户密码加签验证token
            // 注意这里需要配置JWT的验证器，并传入正确的密钥
            JWTVerifier jwtVerifier = JWT.require(Algorithm.HMAC256(admin.getPassword())).build(); // 这里需要配置JWT验证器
            jwtVerifier.verify(token); // 验证token
        } catch (JWTVerificationException e) { // 注意异常类名的大小写
            throw new CustomException("token验证失败，请重新登录");
        }
        log.info("通过允许放行");
        // 如果验证通过，返回true继续处理请求
        return true;
    }
}

